package lib;

@:jsRequire("zip")
extern class Zip {
	/**
	 * 判断文件是否是zip格式
	 * @param filename 文件名
	 * @return Bool 返回true代表文件是zip文件
	 */
	public static function isZipFile(filename:String):Bool;

	/**
	 * 打开一个zip文件
	 * @param pathOrBuff  文件路径/zip文件流
	 * @param mod 打开文件模式, "r"代表读取, "w"代表创建, "a"代表在zip文件后追加
	 * @param compress_type Integer, 压缩类型, ZIP_STORED 代表不压缩, 仅存储。 默认使用ZIP_DEFLATED 代表使用zlib库进行压缩。
	 * @return ZipFile
	 */
	public static function open(pathOrBuff:String, mod:String = "r", compress_type:Int = 1):ZipFile;
}

extern class ZipFile {
	/**
	 * 获取文件名列表
	 * @return NArray, 返回包含文件名的列表对象
	 */
	public function namelist():Array<String>;

	/**
	 * 获取文件信息列表
	 * @return NArray, 返回包含文件名的列表对象
	 */
	public function infolist():Array<String>;

	/**
	 * 获取文件信息
	 * @param member  String, 指定要获取信息的文件名
	 * @return Array<String> NObject, 返回文件信息对象 文件信息包含字段有：filename, date, compress_type, compress_size, file_size, password, data
	 */
	public function getinfo(member:String):Array<String>;

	/**
	 * 返回从压缩文件读取的数据
	 * @param member String, 指定要读取的文件名
	 * @param password  String, 解压密码, 默认没有密码
	 * @return Array<String> Buffer, 返回文件的所有数据
	 */
	public function read(member:String, password:String = ""):Dynamic;

	/**
	 * 解压所有文件
	 * @param password  解压密码, 默认没有密码
	 * @return Dynamic NArray, 包含所有文件数据及信息的列表
	 */
	public function readAll(password:String = ""):Array<String>;

	/**
	 * 解压指定文件
	 * @param member  String, 指定要解压的文件名
	 * @param path  String, 指定要解压到的路径
	 * @param password String, 解压密码, 默认没有密码
	 * @return Array<String>
	 */
	public function extract(member:String, path:String, password:String = ""):Void;

	/**
	 * 解压所有文件到指定路径
	 * @param path String, 指定要解压到的路径
	 * @param password String, 解压密码, 默认没有密码
	 */
	public function extractAll(path:String, password:String = ""):Void;

	/**
	 * 写入指定文件到压缩文件
	 * @param filename String, 指定要写入的文件,String, 指定要写入的文件,Buffer, 指定要写入的文件数据
	 * @param inZipName String, 压缩在zip文件内的文件名
	 * @param password 解压密码, 默认没有密码
	 */
	public function write(filename:String, inZipName:String, password:String = ""):Void;

	/**
	 * 关闭打开的zip文件
	 */
	public function close():Void;
}

/**
 * 压缩类型常量
 */
@:enum
abstract ConstZip(Int) {
	/**
	 * 压缩类型常量, 不压缩, 仅存储
	 */
	var ZIP_STORED = 0;
	/**
	 * 压缩类型常量, 需要依赖zlib库进行压缩
	 */
	var ZIP_DEFLATED = 1;
}
